package com.liusy.event;

import org.apache.log4j.Logger;

/**
 * 抽像的事件接口
 * 
 * @author liusy 2012-04-5
 *
 */
public abstract class AbstractEvent implements IEvent{
	
	  private static Logger log = Logger.getLogger(AbstractEvent.class);

	/**
	 *  指示事件是否为冒泡事件。 Event
	 */
	private Boolean bubbles;

	/**
	 *  指示是否可以阻止与事件相关联的行为。 Event
	 */
	private Boolean cancelable;

	/**
	 * 对类对象或给定对象实例的构造函数的引用。 Object
	 */
	private Object constructor;

	/**
	 *  当前正在使用某个事件侦听器处理 Event 对象的对象。 Event
	 */
	private Object currentTarget;

	/**
	 *  事件流中的当前阶段。 Event
	 */
	private int eventPhase;

	/**
	 *  对类或函数对象的原型对象的引用。 Object
	 */
	private Object prototype;

	/**
	 *  事件目标。 Event
	 */
	private Object target;

	/**
	 *  事件的类型。
	 */
	private String type;
	
	private Boolean isDefaultPrevented = false;
	
	/**
	 * 事件包含数据
	 */
	private Object data;
	
	public AbstractEvent(String type) {
		this(type,true,true);
	}
	
	public AbstractEvent(String type, Object data) {
		this(type);
		setData(data);
	}
	

	/**
	 * 创建一个作为参数传递给事件侦听器的 Event 对象。 Event
	 * 
	 * @param type
	 * @param bubbles 事件是否冒泡， default true
	 * @param cancelable 事件是否可取消, default true
	 */
	public AbstractEvent(String type, Boolean bubbles /*=true*/, Boolean cancelable/*=true*/) {
		this.type = type;
		this.bubbles = bubbles;
		this.cancelable = cancelable;
	}
	
	@Override
	public String getType(){
		return this.type;
	}
	
	@Override
	public void setData(Object data){
		this.data = data;
	}
	
	/**
	 * 返回事件数据
	 * @return data 返回事件包含数据
	 */
	@Override
	public Object getData(){
		return this.data;
	}

	/**
	 * 指示对象是否已经定义了指定的属性。 Object
	 * @param name
	 * @return
	 */
	public Boolean hasOwnProperty(String name) throws SecurityException{
		/*
		Field[] fields = Event.class.getDeclaredFields();
		for (int i = 0; i < fields.length; i++) {
			fields[i].setAccessible(true); //设置私有属性范围 
			System.out.println("Field[" + i + "] : " + fields[i].getName());

		}*/
		
		try {
			this.getClass().getDeclaredField(name);
			return true;
		}catch (NoSuchFieldException e) {
			log.debug("对象没有指定key["+name+"]的属性。", e);
			return false;
		}

		
	}

	/**
	 * 检查是否已对事件调用 preventDefault()。 Event
	 * 
	 * @return
	 */
	public Boolean isDefaultPrevented() {
		return this.isDefaultPrevented;
	}

	/**
	 * 指示 Object 类的实例是否在指定为参数的对象的原型链中。 Object
	 * 
	 * @param theClass
	 * @return
	 */
	public Boolean isPrototypeOf(Object theClass) {
		//TODO
		throw new RuntimeException("方法没有实现。");
	}

	/**
	 * 如果可以取消事件的默认行为，则取消该行为。 Event
	 */
	public void preventDefault() {
        //TODO
		isDefaultPrevented = true;
	}

	/**
	 * 指示指定的属性是否存在、是否可枚举。 Object
	 * 
	 * @param name
	 * @return
	 */
	public Boolean propertyIsEnumerable(String name) {
		//TODO
		throw new RuntimeException("方法没有实现。");
	}

	/**
	 * 设置循环操作动态属性的可用性。 Object
	 * 
	 * @param name
	 * @param isEnum
	 */
	public void setPropertyIsEnumerable(String name, Boolean isEnum) {
		//TODO
		throw new RuntimeException("方法没有实现。");
	}

	/**
	 * 防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。 Event
	 */
	public void stopImmediatePropagation() {
		//TODO
		throw new RuntimeException("方法没有实现。");
	}

	/**
	 * 防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。 Event
	 */
	public void stopPropagation() {
		//TODO
		throw new RuntimeException("方法没有实现。");
	}

	/**
	 * 在自定义 Event 类中实现 toString() 方法的实用程序函数。 Event
	 * 
	 * @param className
	 * @param args
	 * @return
	 */
	public String formatToString(String className, Object... args) {
		//TODO
		throw new RuntimeException("方法没有实现。");
	}

	/**
	 * 返回一个字符串，其中包含 Event 对象的所有属性。
	 * 
	 * @return
	 */
	public String toString() {
		return super.toString();
	}

	/**
	 * 复制 Event 子类的实例。 Event
	 * 
	 * @return {@link AbstractEvent}
	 */
	public AbstractEvent clone() {
		//TODO
		throw new RuntimeException("方法没有实现。");
	}

}
